#include "volumetool.h"
#include "ui_volumetool.h"
#include <QGraphicsDropShadowEffect>
#include <QPainter>
#include <QPoint>
#include <QPolygon>

#include <qaudio.h>

volumeTool::volumeTool(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::volumeTool)
    , is_muted_(false)
    , volume_ratio_(20)
{
    ui->setupUi(this);

    //setAttribute(Qt::WA_TranslucentBackground);
    setWindowFlags(Qt::Popup | Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint);
    setAttribute(Qt::WA_TranslucentBackground, true);

    //QGraphicsDropShadowEffect* shadow_effect = new QGraphicsDropShadowEffect(this);
    //shadow_effect->setColor("#646464");
    //shadow_effect->setBlurRadius(10);
    //shadow_effect->setOffset(0, 0);
    //setGraphicsEffect(shadow_effect);

    // 设置静音按钮图标
    ui->silenceBtn->setIcon(QIcon(":/images/volumn.png"));

    // 设置初始音量显示文本
    ui->volumeRatio->setText("20%");

    const QRect rect = ui->outLine->geometry();
    // 窗口原本高度180*20%，25rect具体父元素上方的距离
    ui->outLine->setGeometry(rect.x(), 180 - 36 + 25, rect.width(), 36);
    // 移动按钮位置
    ui->silderBtn->move(ui->silderBtn->x(), ui->outLine->y() - ui->silderBtn->height() / 2);

    // 连接静音按钮点击信号
    connect(ui->silenceBtn, &QPushButton::clicked, this, &volumeTool::onSilenceBtnClicked);

    // 安装事件过滤器以处理鼠标事件
    ui->volumeBox->installEventFilter(this);
    ui->silderBtn->installEventFilter(this);
}

/**
 * @brief 计算并设置音量
 * @details 该函数根据鼠标在音量控制区域的位置计算音量值，
 *          并更新音量条的显示位置和音量显示文本。
 *          音量值范围为0-100%，通过鼠标Y坐标在有效范围内(30-210)的位置计算得出。
 */
void volumeTool::calcVolume()
{
    // 将全局鼠标坐标转换为volumeBox的局部坐标
    const QPoint localPos = ui->volumeBox->mapFromGlobal(QCursor().pos());
    int localY = localPos.y();

    // 限制在有效范围内(0到180)
    localY = localY < 30 ? 30 : localY;
    localY = localY > 210 ? 210 : localY;

    // 更新音量条的位置和大小
    ui->outLine->setGeometry(ui->outLine->x(), localY, ui->outLine->width(), 210 - localY);
    // 更新滑块位置
    ui->silderBtn->move(ui->silderBtn->x(), ui->outLine->y() - ui->silderBtn->height() / 2);

    // 计算音量比例并更新显示
    volume_ratio_ = static_cast<int>((210 - localY) / static_cast<float>(180) * 100);
    ui->volumeRatio->setText(QString::number(volume_ratio_) + "%");
}
volumeTool::~volumeTool()
{
    delete ui;
}

/**
 * @brief 静音按钮点击事件处理函数
 * @details 该函数在用户点击静音按钮时被调用，
 *          切换静音状态并更新按钮图标：
 *          - 静音时显示静音图标
 *          - 非静音时显示音量图标
 *          同时发出setSilence信号通知音量状态变化。
 */
void volumeTool::onSilenceBtnClicked()
{
    // 切换静音状态
    is_muted_ = !is_muted_;
    if (is_muted_)
        // 设置静音图标
        ui->silenceBtn->setIcon(QIcon(":/images/silent.png"));
    else
        // 设置音量图标
        ui->silenceBtn->setIcon(QIcon(":/images/volumn.png"));
    // 发出静音状态改变信号
    emit setSilence(is_muted_);
}

/**
 * @brief 绘制事件处理函数
 * @param event 绘制事件对象
 * @details 该函数用于绘制音量工具窗口下方的三角形指示器，
 *          通过QPainter在指定位置绘制一个白色三角形。
 * @note 此函数重写了父类QWidget的paintEvent虚函数
 */
void volumeTool::paintEvent(QPaintEvent *event)
{
    // 绘制volumeTool界面下的三角
    (void) event;
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.setPen(Qt::NoPen);
    painter.setBrush(Qt::white);

    // 定义三角形的三个顶点
    QPolygon polygon;
    polygon.append(QPoint(30, 300));
    polygon.append(QPoint(70, 300));
    polygon.append(QPoint(50, 320));

    // 绘制三角形
    painter.drawPolygon(polygon);
}

/**
 * @brief 事件过滤器，处理鼠标事件
 * @param watched 被监视的对象
 * @param event 事件对象
 * @return bool 如果事件被处理返回true，否则返回false
 * @details 该函数用于处理音量控制区域和滑块的鼠标事件，
 *          包括鼠标按下、释放和移动事件，都会触发音量计算和更新。
 * @note 此函数重写了父类QObject的eventFilter虚函数
 */
bool volumeTool::eventFilter(QObject *watched, QEvent *event)
{
    // 处理音量控制区域和滑块的鼠标事件
    if (watched == ui->volumeBox)
    {
        // 判断事件类型是否为鼠标按下、释放或移动事件
        if (event->type() == QEvent::MouseButtonPress ||
            event->type() == QEvent::MouseButtonRelease ||
            event->type() == QEvent::MouseMove)
        {
            // 计算音量
            calcVolume();
            // 发射信号设置音乐音量
            emit setMusicVolume(volume_ratio_);
            // 事件已被处理，返回true
            return true;
        }
    }
    // 检查监视对象是否为滑块按钮
    else if (watched == ui->silderBtn)
    {
        // 同样判断事件类型是否为鼠标按下、释放或移动事件
        if (event->type() == QEvent::MouseButtonPress ||
            event->type() == QEvent::MouseButtonRelease ||
            event->type() == QEvent::MouseMove)
        {
            // 计算音量
            calcVolume();
            // 发射信号设置音乐音量
            emit setMusicVolume(volume_ratio_);
            // 事件已被处理，返回true
            return true;
        }
    }
    // 如果不是上述情况，则调用基类的eventFilter方法进行默认处理
    return QObject::eventFilter(watched, event);
}
